import java.awt.*;         //加载awt图形工具包
import java.awt.event.*;   //加载awt图形工具包
import javax.swing.*;     //加载swing图形工具包
import javax.swing.table.*;//加载swing下的table包中的类
import javax.swing.event.*;//加载swing控件对应的事件包
import java.util.*;       //加载常用工具包
import java.sql.*;         //加载数据库操作包

/**
 * 图书管理系统-版本二
 */
class DBBookManageGUI extends JFrame implements ActionListener, ItemListener, ListSelectionListener {
    DBAccess db;                  //封装了数据库操作的类
    String sql;                   //对数据库进行各种操作的SQL命令
    LinkedList<Book> booklist;
    Iterator<Book> it;
    Book book;                  //可租图书对象，中间传递引用
    JTable booktable;  //定义一个显示图书信息的表格
    DefaultTableModel dModel;  //默认表格模型，内部使用Vector存储数据
    CheckEmpty cktxt;          //自定义的用于检查文本框输入不许为空或负数的类
    String publisher;
    String bname;    //保存书名
    int i = 0;   //表格当前行号
    int findflag = 0;    //查找到记录标记

    //定义并初始化几个输入，输出提示标签
    JLabel lblPrompt = new JLabel("操作信息提示");        //操作提示信息
    JLabel lblBookNo = new JLabel("图书入库号");          //图书入库号
    JLabel lblISBN = new JLabel("图书ISBN：");          //图书统一编号
    JLabel lblBookName = new JLabel("书    名：");          //书名
    JLabel lblAuthor = new JLabel("作    者：");          //作者
    JLabel lblPublisher = new JLabel("出 版 社：");          //出版社
    JLabel lblPrice = new JLabel("定    价：");         //定价


    //定义几个接受用户输入的提示标签
    JTextField txtBookNo = new JTextField();
    JTextField txtISBN = new JTextField();
    JTextField txtBookName = new JTextField();
    JTextField txtAuthor = new JTextField();
    JTextField txtPrice = new JTextField();
    JComboBox cbPublisher = new JComboBox();


    //定义几个用户操作按钮
    JButton btnCreateBook = new JButton("创建新书");  //创建新书
    JButton btnSearchBook = new JButton("查询");  //查询
    JButton btnDeleteBook = new JButton("删除");  //删除
    JButton btnEditBook = new JButton("修改");   //修改
    JButton btnReset = new JButton("清空信息");     //清空界面
    JButton btnDisplay = new JButton("列出图书");  //列出图书


    DBBookManageGUI() {
        booklist = new LinkedList<Book>();

        this.setTitle("图书管理类操作的图形用户界面");   //设置窗体标题
        publisher = "高等教育出版社";

        cbPublisher.addItem("高等教育出版社");
        cbPublisher.addItem("清华大学出版社");
        cbPublisher.addItem("南京大学出版社");
        cbPublisher.addItem("中国铁道出版社");
        cbPublisher.addItem("中国邮电出版社");
        cbPublisher.addItem("机械工业出版社");
        cbPublisher.addItem("电子工业出版社");
        cbPublisher.addItem("其他出版社");


        //为按钮注册事件监听器
        btnCreateBook.addActionListener(this);
        btnSearchBook.addActionListener(this);
        btnDeleteBook.addActionListener(this);
        btnEditBook.addActionListener(this);
        btnReset.addActionListener(this);
        btnDisplay.addActionListener(this);


        //数据库初始化
        db = new DBAccess();
        //定义一个显示图书信息的表格，采用DefaultTableModel表格数据模型，当组件内容大于显示区域是会自动产生滚动条
        String[] columnNames = {"入库号", "ISBN", "书名", "作者", "定价", "出版社"};//表格列名
        String[][] data0 = new String[0][0];//表格数据源，初始化为空白


        dModel = new DefaultTableModel(data0, columnNames);//定义表格的默认数据类型

        booktable = new JTable(dModel);//用默认的数据模型新建一个表格对象
        booktable.setAutoscrolls(true);//支持自动产生滚动条
        booktable.setGridColor(Color.blue);//设置表格线条颜色
        booktable.setRowHeight(25);//设置表格行高
        booktable.setSelectionForeground(Color.red);//设置当前选中内容的颜色
        JScrollPane jstb = new JScrollPane(booktable);//将表格放入带滚动条的面板中

        //表格注册列表选取模型事件监听器
        booktable.getSelectionModel().addListSelectionListener(this);

        //下拉组合框注册事件监听器
        cbPublisher.addItemListener(this);

        //为控件定义外观和显示位置
        Container c = getContentPane();
        c.setLayout(null);//采用空布局，调用setBounds()方法


        //将标签加到容器里
        c.add(lblPrompt);
        c.add(lblBookNo);
        c.add(lblISBN);
        c.add(lblBookName);
        c.add(lblAuthor);
        c.add(lblPrice);
        c.add(lblPublisher);

        //将文本框加到容器里
        c.add(txtBookNo);
        c.add(txtISBN);
        c.add(txtBookName);
        c.add(txtAuthor);
        c.add(txtPrice);
        c.add(cbPublisher);

        c.add(jstb);   //将表格加到容器里

        //将按钮加到容器里
        c.add(btnCreateBook);
        c.add(btnSearchBook);
        c.add(btnDeleteBook);
        c.add(btnEditBook);
        c.add(btnReset);
        c.add(btnDisplay);


        //给各个界面元素定位  （x,y,width,height）
        btnCreateBook.setBounds(10, 300, 90, 40);   //各按钮
        btnDisplay.setBounds(110, 300, 90, 40);
        btnSearchBook.setBounds(210, 300, 80, 40);
        btnEditBook.setBounds(300, 300, 80, 40);
        btnDeleteBook.setBounds(390, 300, 80, 40);
        btnReset.setBounds(480, 300, 90, 40);

        lblBookNo.setBounds(50, 10, 100, 40);  //各标签
        lblISBN.setBounds(50, 60, 100, 40);
        lblBookName.setBounds(50, 110, 100, 40);
        lblAuthor.setBounds(50, 160, 100, 40);
        lblPrice.setBounds(50, 210, 100, 40);
        lblPublisher.setBounds(50, 260, 100, 40);


        txtBookNo.setBounds(120, 10, 200, 40);
        txtISBN.setBounds(120, 60, 200, 40);//各标签
        txtBookName.setBounds(120, 110, 400, 40);
        txtAuthor.setBounds(120, 160, 120, 40);
        txtPrice.setBounds(120, 210, 120, 40);
        cbPublisher.setBounds(120, 260, 120, 40);//组合框

        jstb.setBounds(50, 380, 500, 150);//带滚动条的表格外观
        lblPrompt.setBounds(20, 330, 550, 40);  //操作结果提示标签
        lblPrompt.setForeground(Color.red);

        //采用匿名类实现了窗体标题栏上“X”按钮的关闭功能
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent ew) {
                dispose();   //关闭窗口并释放所占屏幕资源
                // System.exit(0);    //系统退出，多窗口操作时不要此句
            }
        });


        this.setBounds(300, 50, 600, 580);  //设置窗体在屏幕位置、宽度、高度
        this.setVisible(true);     //让窗体可见
        this.setResizable(false);   //让窗口不可改动大小

    }


    //重载ItemListener接口的方法，组合框选择改变时，则出版社不同
    @Override
    public void itemStateChanged(ItemEvent e) {
        //换选出版社
        if (e.getItemSelectable() instanceof JComboBox) {
            JComboBox cb = (JComboBox) (e.getItemSelectable());  //获取组合框对象
            publisher = cb.getSelectedItem().toString();  //取得选项字符串
            lblPrompt.setText(publisher);  ////
        }
    }


    //重载ItemListener接口的方法，取出表格当前行号
    @Override
    public void valueChanged(ListSelectionEvent e) {
        i = booktable.getSelectedRow();   //获取当前选中的行对象
        outputData();
    }

    //动作事件，各按钮响应
    @Override
    public void actionPerformed(ActionEvent evt) {
        if (evt.getSource() == btnCreateBook) {
            cktxt = new CheckEmpty(txtPrice);
            System.out.println(cktxt.check(1));
            if (cktxt.check(1)) {
                //根据各文本框内容新建一个图书对象，编号自动递增
                String bno = txtBookNo.getText();  //获取图书入库编号
                String bname = txtBookName.getText();  //获取书名
                String isbn = txtISBN.getText();  //获取书号
                String au = txtAuthor.getText();  //获取作者
                String p = txtPrice.getText();  //获取定价
                book = new Book(isbn, bname, au, publisher, p, bno);   //新建一个书的对象
                inputData();           //将图书信息显示在下面的表格中

                //将操作结果写入数据库
                sql = "insert into mybook values('" + bno + "','" + isbn + "','" + bname + "','" + au + "','" + p + "','" + publisher + "')";
                db.dbconn();
                db.dbInsert(sql);
                lblPrompt.setText(db.notes);//显示数据库操作结果
//                db.dbclose();
            }
        } else if (evt.getSource() == btnDisplay) {
            //从数据库中读取所有数据
            try {
                sql = "select * from mybook";
                display(sql);   //在表格中显示所有图书对象
            } catch (Exception k) {
                k.printStackTrace();
            }
            //按书名查询，
        } else if (evt.getSource() == btnSearchBook) {
            cktxt = new CheckEmpty(txtBookName);
            //System.out.println(cktxt.check(0));
            if (cktxt.check(0)) {
                int findflag = 0;
                bname = txtBookName.getText();

                //从数据库中读取指定数据
                sql = "select * from mybook where bookName like '%" + bname + "%'";
                display(sql);

                if (findflag == 0) {
                    lblPrompt.setText("查到所要的图书。");
                }
            }
            txtBookName.setText(bname);
        } else if (evt.getSource() == btnEditBook) {
            cktxt = new CheckEmpty(txtPrice);
            //System.out.println(cktxt.check(1));
            //对文本框输入数据的有效性进行检查
            if (cktxt.check(1)) {
                //修改表格中显示的数据
                dModel.setValueAt((Object) txtBookNo.getText(), i, 0);
                dModel.setValueAt((Object) txtISBN.getText(), i, 1);
                dModel.setValueAt((Object) txtBookName.getText(), i, 2);
                dModel.setValueAt((Object) txtAuthor.getText(), i, 3);
                dModel.setValueAt((Object) txtPrice.getText(), i, 4);
                dModel.setValueAt((Object) publisher, i, 5);


                //在数据库中更新指定的数据
                sql = "update mybook set price=" + Double.parseDouble(txtPrice.getText()) + ",ISBN='" + txtISBN.getText() + "',bookName='" + txtBookName.getText() + "',publisher='" + publisher + "',author='" + txtAuthor.getText() + "'where bookID='" + txtBookNo.getText() + "'";
                db.dbconn();
                db.dbUpdate(sql);
                lblPrompt.setText(db.notes);   //显示数据库操作结果
//                db.dbclose();
            }
        } else if (evt.getSource() == btnDeleteBook) {
            if (dModel.getRowCount() == 0) {
                lblPrompt.setText("没有图书可删！");
            } else {
                String dNo = dModel.getValueAt(i, 0).toString();
                dModel.removeRow(i);
                i = 0;     //避免未选中表格行而点此按钮出错
                sql = "delete from mybook where bookID='" + dNo + "'";
                db.dbconn();
                db.dbDelete(sql);
//                db.dbclose();
                lblPrompt.setText(db.notes);
            }
        } else if (evt.getSource() == btnReset) {
          //  reset();    //清空用户界面
            sql = "select * from mybook where 1=2";   //删除数据库中的记录
            display(sql);
//            db.dbconn();
//            db.dbSelect(sql);
//            db.dbclose();
            lblPrompt.setText(db.notes);
        }
    }

    //将界面清空，含文本框及表格内容被清除
    public void reset() {
        txtBookNo.setText("");
        txtISBN.setText("");
        txtBookName.setText("");
        txtAuthor.setText("");
        txtPrice.setText("");
        for (int index = dModel.getRowCount() - 1; index >= 0; index--) {
            dModel.removeRow(index);
            i--;
        }
    }

    //将所有图书对象的信息显示在表格中
		/*String ID="10"+" ";
		public String setID(String id)
		{
			ID=id;
		}
		public String getID()
		{
			return ID;
		}
*/
    public void display(String sql1) {
        reset();
        db.dbconn();
        db.dbSelect(sql1);
        try {
            //查到记录时
            while (db.rs.next()) {
                findflag = 1;
                book = new Book(db.rs.getString(2), db.rs.getString(3), db.rs.getString(4), db.rs.getString(6), db.rs.getString(5), db.rs.getString(1)/*,db.rs.getString(7)*/);
                inputData();
            }
        } catch (SQLException es) {
            System.out.println(es);
        }
        lblPrompt.setText(db.notes);//显示数据库
//        db.dbclose();
    }

    /*public void display(String sql1)
    {
        reset();
        it=booklist.iterator();
        while(it.hasNext()){
            book=it.next();
            inputData();
        }
    }*/
    //将新建的图书对象逐行加入向量，显示在表格中
    public void inputData() {
        Vector<String> data = new Vector<String>();
        data.addElement(book.getbookNo());
        data.addElement(book.getISBN());
        data.addElement(book.getBookName());
        data.addElement(book.getAuthor());
        data.addElement(Double.valueOf(book.getPrice()).toString());
        data.addElement(book.getPublisher());
        dModel.addRow(data);    //将向量加入表格数据模型
    }


    //将当前图书对象的信息显示在对应的文本框中，以便查看、编辑
    public void outputData() {
        txtBookNo.setText(dModel.getValueAt(i, 0).toString());
        txtISBN.setText(dModel.getValueAt(i, 1).toString());
        txtBookName.setText(dModel.getValueAt(i, 2).toString());
        txtAuthor.setText(dModel.getValueAt(i, 3).toString());
        txtPrice.setText(dModel.getValueAt(i, 4).toString());
        cbPublisher.setSelectedItem(dModel.getValueAt(i, 5).toString());
    }

    //调试本界面程序使用，应用程序有其他入口时，注释掉此方法
    //程序入口
    public static void main(String args[]) {
        new DBBookManageGUI();   //构造一个新窗体对象
    }

}